<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // https://www.bilibili.com/video/BV1Zy4y1K7SH?p=34
    let data = {
      name: '名字',
      address: '地址'
    }

    // let temp = '名字'
    // setInterval(() => {
    //   if(data.name === temp) {
    //     console.log('data.name被更改了!')
    //   }
    // })
    
    // 内存泄漏 
    // Object.defineProperty(data, 'name', {
    //   get() {
    //     return data.name
    //   },
    //   set(val) {
    //     data.name = val
    //   }
    // })

    // 创建一个监视的实例对象，用于监视data中属性的变化
    const obs = new Observer(data)
    console.log(obs)

    // 准备一杯vm实例对象
    let vm = {}
    vm._data = data = obs

    function Observer(obj) {
      // 汇总对象中所有的属性形成一个数组
      const keys = Object.keys(obj)
      // 遍历
      keys.forEach((k) => {
        Object.defineProperty(this, k, {
          get() {
            return obj[k]
          },
          set(val) {
            console.log(`${k}被改了，我要去解析模板，生成虚拟DOM......我要开始忙了`)
            obj[k] = val
          }
        })
      })
    }

   
  </script>
</body>
</html>